stylecontext: add opaque background helper
authorChristian Hergert <christian@hergert.me>
Tue, 8 Sep 2015 21:45:51 +0000 (14:45 -0700)
committerChristian Hergert <christian@hergert.me>
Sun, 13 Sep 2015 20:41:19 +0000 (13:41 -0700)
This new private API, _gtk_style_context_is_background_opaque(), is meant to
be used by internal Gtk+ wigets to optimize fast paths for cases where
applicable. One such use would be to use a CAIRO_CONTENT_COLOR surface
instead of CAIRO_CONTENT_COLOR_ALPHA.

https://bugzilla.gnome.org/show_bug.cgi?id=754658

gtk/gtkstylecontext.c
gtk/gtkstylecontextprivate.h

index ddc0d11a69dabefe67bdfe431035748e37a72e7d..c795cc0827adebe5144fdaedf61efa7874824feb 100644 (file)
@@ -2504,11 +2504,7 @@ gtk_style_context_set_background (GtkStyleContext *context,
    */
   color = _gtk_css_rgba_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BACKGROUND_COLOR));
 
-  if (color->alpha >= 1.0 &&
-      corner_value_is_right_angle (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS)) &&
-      corner_value_is_right_angle (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS)) &&
-      corner_value_is_right_angle (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS)) &&
-      corner_value_is_right_angle (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS)))
+  if (_gtk_style_context_is_background_opaque (context))
     {
       gdk_window_set_background_rgba (window, color);
     }
@@ -3305,3 +3301,18 @@ gtk_gradient_resolve_for_context (GtkGradient     *gradient,
                                      priv->parent ? gtk_style_context_lookup_style (priv->parent) : NULL);
 }
 
+gboolean
+_gtk_style_context_is_background_opaque (GtkStyleContext *context)
+{
+  const GdkRGBA *color;
+
+  g_return_val_if_fail (context != NULL, FALSE);
+
+  color = _gtk_css_rgba_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BACKGROUND_COLOR));
+
+  return (color->alpha >= 1.0 &&
+          corner_value_is_right_angle (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS)) &&
+          corner_value_is_right_angle (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS)) &&
+          corner_value_is_right_angle (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS)) &&
+          corner_value_is_right_angle (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS)));
+}
index 1ed7b21351345a662149b191dc39513e38c86a9f..4ba27fe3345c1c73fd22c7224a61ac4354032ce8 100644 (file)
@@ -64,6 +64,8 @@ void           _gtk_style_context_get_icon_extents           (GtkStyleContext
                                                               gint                width,
                                                               gint                height);
 
+gboolean       _gtk_style_context_is_background_opaque       (GtkStyleContext *context);
+
 PangoAttrList *_gtk_style_context_get_pango_attributes       (GtkStyleContext *context);
 
 /* Accessibility support */